package com.zjsru.plan2024.oneday;

import java.util.Arrays;
import java.util.List;

/**
 * @Author: cookLee
 * @Date: 2024-01-25
 * 计算 K 置位下标对应元素的和
 */
public class SumIndicesWithKSetBits {

    /**
     * 主
     * \
     * 输入：nums = [5,10,1,5,2], k = 1
     * 输出：13
     * 解释：下标的二进制表示是：
     * 0 = 0002
     * 1 = 0012
     * 2 = 0102
     * 3 = 0112
     * 4 = 1002
     * 下标 1、2 和 4 在其二进制表示中都存在 k = 1 个置位。
     * 因此，答案为 nums[1] + nums[2] + nums[4] = 13 。
     * \
     * 输入：nums = [4,3,2,1], k = 2
     * 输出：1
     * 解释：下标的二进制表示是：
     * 0 = 002
     * 1 = 012
     * 2 = 102
     * 3 = 112
     * 只有下标 3 的二进制表示中存在 k = 2 个置位。
     * 因此，答案为 nums[3] = 1 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        SumIndicesWithKSetBits sumIndicesWithKSetBits = new SumIndicesWithKSetBits();
        List<Integer> nums = Arrays.asList(5, 10, 1, 5, 2);
        int k = 1;
        System.out.println(sumIndicesWithKSetBits.sumIndicesWithKSetBits(nums, k));
    }

    /**
     * 带kset位总和索引
     *
     * @param nums nums
     * @param k    k
     * @return int
     */
    public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            //按照位数获取二进制
            if (this.helper(i) == k) {
                ans += nums.get(i);
            }
        }
        return ans;
    }

    /**
     * 帮手
     * 获取置位1助手类
     *
     * @param num num
     * @return int
     */
    private int helper(Integer num) {
        int cnt = 0;
        while (num != 0) {
            cnt += num % 2;
            num = num / 2;
        }
        return cnt;
    }

}
